DataFrame

DataFrame类型的数据是带行索引和列索引的二维表数据。下面用pandas包的DataFrame方法将一个二维列表转换为DataFrame对象。[大谦Excel,dqexcel点com]

code.python
>>> import pandas as pd    #导入pandas包
>>> data=[[1,2,3],[4,5,6],[7,8,9]]    #创建二维列表
>>> df=pd.DataFrame(data)    #利用二维列表创建DataFrame对象
>>> df
   0  1  2
0  1  2  3
1  4  5  6
2  7  8  9

上面df即为利用二维列表创建的DataFrame对象,第1行的0~2为自动生成的列索引标签,第1列的0~2为自动生成的行索引标签,内部3行3列的1~9为df的值。

创建DataFrame对象

上面用二维列表创建了DataFrame对象。使用index参数可以设置行索引标签,使用columns参数可以设置列索引标签。

code.python
>>> data=[[1,2,3],[4,5,6],[7,8,9]]
>>> df=pd.DataFrame(data,index=['a','b','c'],columns=['A','B','C'])
>>> df
   A  B  C
a  1  2  3
b  4  5  6
c  7  8  9

下面利用二维元组创建DataFrame对象。

code.python
>>> data=((1,2,3),(4,5,6),(7,8,9))
>>> df=pd.DataFrame(data)
>>> df
   0  1  2
0  1  2  3
1  4  5  6
2  7  8  9

利用字典创建DataFrame对象。字典中键值对的键表示列索引标签,值用数据区的行数据组成列表表示。

code.python
>>> data={'a':[1,2,3],'b':[4,5,6],'c':[7,8,9]}
>>> df=pd.DataFrame(data)
>>> df
   a  b  c
0  1  4  7
1  2  5  8
2  3  6  9

利用NumPy数组创建DataFrame对象。

code.python
>>> import numpy as np
>>> data=np.array(([1, 2, 3], [4, 5, 6],[7,8,9]))
>>> df=pd.DataFrame(data)
>>> df
   0  1  2
0  1  2  3
1  4  5  6
2  7  8  9

DataFrame对象的描述

创建DataFrame对象以后,可以使用info, describe, dtypes, shape等一系列属性和方法对它进行描述。下面首先创建一个DataFrame对象df。

code.python
>>> data=[[1,2,3],[4,5,6],[7,8,9]]
>>> df=pd.DataFrame(data,index=['a','b','c'],columns=['A','B','C'])
>>> df
   A  B  C
a  1  2  3
b  4  5  6
c  7  8  9

用info方法获取df的信息。

code.python
>>> df.info()
<class 'pandas.core.frame.DataFrame'>
Index: 3 entries, a to c
Data columns(total 3 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   A       3 non-null      int64
 1   B       3 non-null      int64
 2   C       3 non-null      int64
dtypes: int64(3)
memory usage: 96.0+ bytes

使用info方法获取的DataFrame对象信息包括对象的类型、行索引和列索引信息、每列数据的列标签、非缺失值个数和数据类型、占用内存大小等。

用dtypes属性获取df每列数据的类型。

code.python
>>> df.dtypes
A    int64
B    int64
C    int64
dtype: object

用shape属性获取df的行数和列数,用元组给出。

code.python
>>> df.shape
(3, 3)

用len函数获取df的行数和列数。

code.python
>>> len(df)    #行数
3
>>> len(df.columns)    #列数
3

用index属性获取df的行索引标签。

code.python
>>> df.index
Index(['a', 'b', 'c'], dtype='object')

用columns属性获取df的列索引标签。

code.python
>>> df.columns
Index(['A', 'B', 'C'], dtype='object')

用values属性获取df的值。

code.python
>>> df.values
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]], dtype=int64)

用head方法获取前n行数据,默认时n=5。

code.python
>>> df.head(2)
   A  B  C
a  1  2  3
b  4  5  6

用tail方法获取后n行数据,默认时n=5。

code.python
>>> df.tail(2)
   A  B  C
b  4  5  6
c  7  8  9

用describe方法获取df每列数据的描述统计量,包括数据个数、均值、标准差、最小值、25%分位数、中值、75%分位数、最大值等。

code.python
>>> df.describe()
         A    B    C
count  3.0  3.0  3.0
mean   4.0  5.0  6.0
std    3.0  3.0  3.0
min    1.0  14.0  3.0
25%    14.5  3.5  4.5
50%    4.0  5.0  6.0
75%    5.5  6.5  7.5
max    7.0  8.0  9.0

数据索引和切片

创建DataFrame对象后,如果希望提取其中的某行某列或某些行某些列,需要通过索引或切片来实现。可以使用中括号获取单个索引,此时返回的是Series类型;或者中括号里面用一个列表获取多个索引,此时返回的是一个DataFrame类型。

下面创建一个DataFrame对象df。

code.python
>>> data=[[1,2,3],[4,5,6],[7,8,9]]
>>> df=pd.DataFrame(data,index=['a','b','c'],columns=['A','B','C'])
>>> df
   A  B  C
a  1  2  3
b  4  5  6
c  7  8  9

用中括号获取列索引标签为" A"的列。

code.python
>>> c1=df['A']
>>> c1
a    1
b    4
c    7
Name: A, dtype: int64

查看c1的数据类型。

code.python
>>> type(c1)
<class 'pandas.core.series.Series'>

可见,通过索引获取DataFrame数据的单列时得到的是一个Series类型的数据。

下面用loc方法获取行索引标签为的行。

code.python
>>> r1=df.loc['a']
>>> r1
A    1
B    2
C    3
Name: a, dtype: int64

查看r1的数据类型。

code.python
>>> type(r1)
<class 'pandas.core.series.Series'>

可见,通过索引获取DataFrame数据的单行时得到的是一个Series类型的数据。也可以用iloc方法获取行,与loc方法不同的是,iloc方法的参数为表示行编号的整数,不是标签。

可以通过指定多个索引标签来获取多个行或列。这多个行或列的索引标签组成列表放在中括号中。

code.python
>>> c23=df[['A','C']]
>>> c23
   A  C
a  1  3
b  4  6
c  7  9
>>> r23=df.loc[['a','c']]
>>> r23
   A  B  C
a  1  2  3
c  7  8  9

查看c23和r23的数据类型。

code.python
>>> type(c23)
<class 'pandas.core.frame.DataFrame'>
>>> type(r23)
<class 'pandas.core.frame.DataFrame'>

可见,获取多行和多列返回的是DataFrame类型的数据。

上面用中括号获取列,用loc方法也可以获取列,例如:

code.python
>>> c4=df.loc[:,'B']
>>> c4
a    2
b    5
c    8
Name: B, dtype: int64

中括号中的冒号表示B标签对应的各行数据全部取。

用中括号获取列时中括号里面输入的是单列的标签,此时返回的是Series类型的数据。如果中括号里面输入的是单列标签组成的列表,返回的则是DataFrame类型的数据。

code.python
>>> c5=df[['B']]
>>> c5
   B
a  2
b  5
c  8
>>> type(c5)
<class 'pandas.core.frame.DataFrame'>

用中括号索引列以后,引用values属性得到的是NumPy数组数据。

code.python
>>> ar=df['B'].values
>>> ar
array([2, 5, 8], dtype=int64)
>>> type(ar)
<class 'numpy.ndarray'>

使用冒号可以对DataFrame数据进行切片。下面的切片取所有行,取列标签"A"到"B"的所有列。

code.python
>>> df.loc[:,'A':'B']
   A  B
a  1  2
b  4  5
c  7  8

下面的切片取行标签"a"到"b"的所有行,取列标签"B"到"C"的所有列。

code.python
>>> df.loc['a':'b','B':'C']
   B  C
a  2  3
b  5  6

下面的切片取行标签"b"及后面的所有行,取列标签"B"及以前的所有列。

code.python
>>> df.loc['b':,:'B']
   A  B
b  4  5
c  7  8

布尔索引

在中括号中使用布尔表达式实现布尔索引。

下面获取df中B列数据大于等于3的行数据。

code.python
>>> df[df['B']>=3]
   A  B  C
b  4  5  6
c  7  8  9

获取df中A列数据大于等于2并且C列数据等于9的行数据。

code.python
>>> df[(df['A']>=2)&(df['C']==9)]
   A  B  C
c  7  8  9

获取df中B列数据界于4和9之间的行数据。

code.python
>>> df[df['B'].between(4,9)]
   A  B  C
b  4  5  6
c  7  8  9

获取df中A列数据取0-5范围内整数的行数据。

code.python
>>> df[df['A'].isin(range(6))]
   A  B  C
a  1  2  3
b  4  5  6

获取df中B列数据界于4和9之间的行数据,然后取A列和C列的数据。

code.python
>>> df[df['B'].between(4,9)][['A','C']]
   A  C
b  4  6
c  7  9

找到行标签为"b"的行中大于等于5的数据。

code.python
>>> df.loc[['b']]>=5
       A     B     C
b  False  True  True

行标签为"b"的行中大于等于5的数据对应的布尔值为True。